package ini

import (
	"fmt"
	"github.com/danfwing/sd-project/pkg/config"
	_ "github.com/lib/pq"
	"time"
	"xorm.io/xorm"
	"xorm.io/xorm/log"
)

// InitDb initializes the database connection
func InitDb(c *config.Config) (*xorm.Engine, error) {
	dbConfig := c.Database

	// 构建PostgreSQL数据库连接字符串
	dsn := fmt.Sprintf("host=%s port=%s user=%s password=%s dbname=%s sslmode=disable",
		dbConfig.Host,
		dbConfig.Port,
		dbConfig.Username,
		dbConfig.Password,
		dbConfig.DBName,
	)

	// 创建数据库引擎
	engine, err := xorm.NewEngine(dbConfig.Driver, dsn)
	if err != nil {
		return nil, fmt.Errorf("failed to create xorm engine: %v", err)
	}

	// 设置数据库连接池
	engine.SetMaxIdleConns(10)           // 设置空闲连接池中的最大连接数
	engine.SetMaxOpenConns(100)          // 设置打开数据库连接的最大数量
	engine.SetConnMaxLifetime(time.Hour) // 设置连接可复用的最大时间

	// 设置日志级别
	if c.Server.Mode == "debug" {
		engine.ShowSQL(true)
		engine.Logger().SetLevel(log.LOG_DEBUG)
	}

	// 测试数据库连接
	if err := engine.Ping(); err != nil {
		return nil, fmt.Errorf("failed to ping database: %v", err)
	}

	return engine, nil
}
